#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define SCANPORT P1
sbit spk=P2^3;                                                                        //按键提示音驱动端口
uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,
                                         0x6d,0x7d,0x07,0x7f,0x6f,  //数码管显示代码
                                         0x77,0x7c,0x39,0x5e,0x79,
                                         0x71};
uchar a_LineScan[4]={0xEF,0xDF,0xBF,0x7F};            //列扫描赋值

void delay(uchar x)
{
  uchar j;
  while(x--)  
  for(j=110;j>0;j--);
}

uchar KeyScan()                                                                    //扫描函数
{
        uchar Temp=0;                                 
        uchar i=0,j=0;            

        for(i=0;i<4;i++)       
                {
                        SCANPORT=a_LineScan[i];                        //定义扫描端口          
                        Temp=SCANPORT & 0x0F;                            //取低四位扫描信号
                        if(Temp!=0)
                        {
                        delay(10);                                                    //消抖函数
                        if(Temp!=0)
                        {                                               
                        if(Temp!=0x0F)                                             //扫描按键是否按下
                                {                                                                         
                                switch(Temp)
                                        {
                                        case 0x0E: j=10;break;            //第一列
                                        case 0x0D: j=20;break;                //第二列
                                        case 0x0B: j=30;break;                //第三列
                                        case 0x07: j=40;break;                //第四列
                                        default:   j=50;break;                //输入错误
                                        }
                                break;
                                }
                        }
                        }
                }
        return i+j+1;                                                                 //送出返回值
}
void KeyProcess(unsigned char KeyCode)                    //数码管显示函数
{
               
        switch(KeyCode)
                {                                                                                //j=10
                case 11:P0=table[0];spk=1;break;            //'0'
                case 12:P0=table[1];spk=1;break;                //'1'
                case 13:P0=table[2];spk=1;break;               
                case 14:P0=table[3];spk=1;break;               
                                                                                                  //j=20
                case 21:P0=table[4];spk=1;break;                //'4'
                case 22:P0=table[5];spk=1;break;                //'5'
                case 23:P0=table[6];spk=1;break;
                case 24:P0=table[7];spk=1;break;
                                                                                                  //j=30
                case 31:P0=table[8];spk=1;break;                //'8'
                case 32:P0=table[9];spk=1;break;                //'9'
                case 33:P0=table[10];spk=1;break;               
                case 34:P0=table[11];spk=1;break;               
                                                                                                //j=40
                case 41:P0=table[12];spk=1;break;                //'C'
                case 42:P0=table[13];spk=1;break;                //'d'
                case 43:P0=table[14];spk=1;break;               
                case 44:P0=table[15];spk=1;break;               

                default:break;                                                        //无法识别
                }
}
void main()
{                                                                                                  
        spk=0;                                                                                //扬声器初始化
        P0=0;
        while(1)
        {
                KeyProcess(KeyScan());
                spk=0;                                                                        //复位扬声器
        }
}
